package com.mm.cloth.utils;

import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.util.Log;
import android.widget.Toast;

import androidx.appcompat.app.AlertDialog;

import com.mm.cloth.LoginActivity;

/**
 * 登录检查工具类
 */
public class LoginCheckUtil {

    // 标记用户是否刚刚登录
    private static boolean justLoggedIn = false;
    
    // 登录请求码
    public static final int LOGIN_REQUEST_CODE = 1001;
    
    private static final String TAG = "LoginCheckUtil";

    /**
     * 检查用户是否已登录
     * @param context 上下文
     * @return 是否已登录
     */
    public static boolean isLoggedIn(Context context) {
        // 使用TokenManager更安全的登录检查
        boolean loggedIn = TokenManager.isLoggedIn(context);
        
        // 如果TokenManager认为用户已登录，再检查一下本地的登录状态
        if (loggedIn) {
            // 兼容旧的检查方式，确保两个系统保持一致
            SharedPreferences sp = context.getSharedPreferences("user_info", Context.MODE_PRIVATE);
            String token = sp.getString("token", null);
            
            if (token == null || token.isEmpty()) {
                // 如果本地没有token但TokenManager有，同步过来
                String tokenManagerToken = TokenManager.getToken(context);
                if (tokenManagerToken != null) {
                    Log.d(TAG, "将TokenManager的令牌同步到本地存储");
                    saveLoginState(context, tokenManagerToken, "{}");
                }
            }
        } else {
            // TokenManager认为用户未登录，但可能旧系统还有token，清除它
            SharedPreferences sp = context.getSharedPreferences("user_info", Context.MODE_PRIVATE);
            String token = sp.getString("token", null);
            if (token != null && !token.isEmpty()) {
                Log.d(TAG, "TokenManager认为用户未登录，清除本地旧令牌");
                clearLoginState(context);
            }
        }
        
        return loggedIn;
    }

    /**
     * 检查用户是否已登录，如果未登录则跳转到登录页面
     * @param context 上下文
     * @param showToast 是否显示提示信息
     * @return 是否已登录
     */
    public static boolean checkLoginAndRedirect(Context context, boolean showToast) {
        if (!isLoggedIn(context)) {
            if (showToast) {
                Toast.makeText(context, "请先登录", Toast.LENGTH_SHORT).show();
            }
            Intent intent = new Intent(context, LoginActivity.class);
            context.startActivity(intent);
            return false;
        }
        return true;
    }
    
    /**
     * 检查用户是否已登录，如果未登录则显示登录对话框
     * @param activity 活动
     * @param message 提示消息
     * @param callback 回调接口，返回用户是否选择登录
     */
    public static void checkLoginWithDialog(Activity activity, String message, LoginCallback callback) {
        if (!isLoggedIn(activity)) {
            // 显示登录提示对话框
            Log.d(TAG, "显示登录对话框");
            new AlertDialog.Builder(activity)
                    .setTitle("需要登录")
                    .setMessage(message)
                    .setPositiveButton("去登录", (dialog, which) -> {
                        // 跳转到登录页面
                        try {
                            Log.d(TAG, "用户点击了去登录按钮");
                            Intent intent = new Intent(activity, LoginActivity.class);
                            // 添加标记，表示这是从对话框跳转过来的
                            intent.putExtra("from_dialog", true);
                            // 使用startActivityForResult启动，以便能够获取登录结果
                            Log.d(TAG, "准备启动LoginActivity: " + LoginActivity.class.getName());
                            activity.startActivityForResult(intent, LOGIN_REQUEST_CODE);
                            Log.d(TAG, "已启动LoginActivity");
                            
                            // 不要在这里调用回调，让onActivityResult处理登录结果
                            // 登录成功后，onActivityResult会接收到RESULT_OK
                        } catch (Exception e) {
                            Log.e(TAG, "启动登录页面失败: " + e.getMessage(), e);
                            Toast.makeText(activity, "无法启动登录页面: " + e.getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    })
                    .setNegativeButton("取消", (dialog, which) -> {
                        Log.d(TAG, "用户取消登录");
                        if (callback != null) {
                            callback.onResult(false); // 未登录，用户选择取消
                        }
                    })
                    .setCancelable(false)
                    .show();
            Log.d(TAG, "登录对话框已显示");
        } else {
            // 已登录，直接回调
            Log.d(TAG, "用户已登录，直接调用回调");
            if (callback != null) {
                callback.onResult(true);
            }
        }
    }

    /**
     * 保存登录状态和用户信息
     * @param context 上下文
     * @param token 登录令牌
     * @param userInfo 用户信息JSON字符串
     */
    public static void saveLoginState(Context context, String token, String userInfo) {
        SharedPreferences sp = context.getSharedPreferences("user_info", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.putString("token", token);
        editor.putString("userInfo", userInfo);
        editor.apply();
        
        // 同步到TokenManager
        TokenManager.saveToken(context, token);
        
        // 设置刚刚登录标记
        justLoggedIn = true;
        
        Log.d(TAG, "保存登录状态，令牌: " + (token != null ? token.substring(0, Math.min(10, token.length())) + "..." : "null"));
    }

    /**
     * 清除登录状态
     * @param context 上下文
     */
    public static void clearLoginState(Context context) {
        SharedPreferences sp = context.getSharedPreferences("user_info", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.clear();
        editor.apply();
        
        // 同步清除TokenManager的认证信息
        TokenManager.clearAuthInfo(context);
        
        Log.d(TAG, "清除登录状态");
    }
    
    /**
     * 检查用户是否刚刚登录
     * @return 是否刚刚登录
     */
    public static boolean isJustLoggedIn() {
        return justLoggedIn;
    }
    
    /**
     * 重置刚刚登录标记
     */
    public static void resetJustLoggedInFlag() {
        justLoggedIn = false;
    }
    
    /**
     * 登录检查回调接口
     */
    public interface LoginCallback {
        /**
         * 登录检查结果回调
         * @param isLoggedIn 是否已登录
         */
        void onResult(boolean isLoggedIn);
    }
} 